!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)}((function(e){function t(s,i){var n=function(){};n={autoSelectFirst:!1,appendTo:"body",serviceUrl:null,lookup:null,onSelect:null,width:"auto",minChars:1,maxHeight:300,deferRequestBy:0,params:{},formatResult:t.formatResult,delimiter:null,zIndex:9999,type:"GET",noCache:!1,onSearchStart:n,onSearchComplete:n,containerClass:"autocomplete-suggestions",tabDisabled:!1,dataType:"text",lookupFilter:function(e,t,s){return-1!==e.value.toLowerCase().indexOf(s)},paramName:"query",transformResult:function(t){return"string"==typeof t?e.parseJSON(t):t}};this.element=s,this.el=e(s),this.suggestions=[],this.badQueries=[],this.selectedIndex=-1,this.currentValue=this.element.value,this.intervalId=0,this.cachedResponse=[],this.onChange=this.onChangeInterval=null,this.isLocal=this.ignoreValueChange=!1,this.suggestionsContainer=null,this.options=e.extend({},n,i),this.classes={selected:"autocomplete-selected",suggestion:"autocomplete-suggestion"},this.initialize(),this.setOptions(i)}var s={extend:function(t,s){return e.extend(t,s)},createNode:function(e){var t=document.createElement("div");return t.innerHTML=e,t.firstChild}};t.utils=s,e.Autocomplete=t,t.formatResult=function(e,t){var s="("+t.replace(RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)","g"),"\\$1")+")";return e.value.replace(RegExp(s,"gi"),"$1")},t.prototype={killerFn:null,initialize:function(){var s,i=this,n="."+i.classes.suggestion,o=i.classes.selected,l=i.options;i.element.setAttribute("autocomplete","off"),i.killerFn=function(t){0===e(t.target).closest("."+i.options.containerClass).length&&(i.killSuggestions(),i.disableKillerFn())},l.width&&"auto"!==l.width||(l.width=i.el.outerWidth()),i.suggestionsContainer=t.utils.createNode(''),(s=e(i.suggestionsContainer)).appendTo(l.appendTo).width(l.width),s.on("mouseover.autocomplete",n,(function(){i.activate(e(this).data("index"))})),s.on("mouseout.autocomplete",(function(){i.selectedIndex=-1,s.children("."+o).removeClass(o)})),s.on("click.autocomplete",n,(function(){i.select(e(this).data("index"),!1)})),i.fixPosition(),window.opera?i.el.on("keypress.autocomplete",(function(e){i.onKeyPress(e)})):i.el.on("keydown.autocomplete",(function(e){i.onKeyPress(e)})),i.el.on("keyup.autocomplete",(function(e){i.onKeyUp(e)})),i.el.on("blur.autocomplete",(function(){i.onBlur()})),i.el.on("focus.autocomplete",(function(){i.fixPosition()}))},onBlur:function(){this.enableKillerFn()},setOptions:function(t){var i=this.options;s.extend(i,t),(this.isLocal=e.isArray(i.lookup))&&(i.lookup=this.verifySuggestionsFormat(i.lookup)),e(this.suggestionsContainer).css({"max-height":i.maxHeight+"px",width:i.width+"px","z-index":i.zIndex})},clearCache:function(){this.cachedResponse=[],this.badQueries=[]},clear:function(){this.clearCache(),this.currentValue=null,this.suggestions=[]},disable:function(){this.disabled=!0},enable:function(){this.disabled=!1},fixPosition:function(){var t;"body"===this.options.appendTo&&(t=this.el.offset(),e(this.suggestionsContainer).css({top:t.top+this.el.outerHeight()+"px",left:t.left+"px"}))},enableKillerFn:function(){e(document).on("click.autocomplete",this.killerFn)},disableKillerFn:function(){e(document).off("click.autocomplete",this.killerFn)},killSuggestions:function(){var e=this;e.stopKillSuggestions(),e.intervalId=window.setInterval((function(){e.hide(),e.stopKillSuggestions()}),300)},stopKillSuggestions:function(){window.clearInterval(this.intervalId)},onKeyPress:function(e){if(this.disabled||this.visible||40!==e.keyCode||!this.currentValue){if(!this.disabled&&this.visible){switch(e.keyCode){case 27:this.el.val(this.currentValue),this.hide();break;case 9:case 13:if(-1===this.selectedIndex)return void this.hide();if(this.select(this.selectedIndex,13===e.keyCode),9===e.keyCode&&!1===this.options.tabDisabled)return;break;case 38:this.moveUp();break;case 40:this.moveDown();break;default:return}e.stopImmediatePropagation(),e.preventDefault()}}else this.suggest()},onKeyUp:function(e){var t=this;if(!t.disabled){switch(e.keyCode){case 38:case 40:return}clearInterval(t.onChangeInterval),t.currentValue!==t.el.val()&&(0'+t(n,s)+""})),o.html(l).show(),this.visible=!0,this.options.autoSelectFirst&&(this.selectedIndex=0,o.children().first().addClass(n))}},verifySuggestionsFormat:function(t){return t.length&&"string"==typeof t[0]?e.map(t,(function(e){return{value:e,data:null}})):t},processResponse:function(e,t){var s=this.options,i=s.transformResult(e,t);i.suggestions=this.verifySuggestionsFormat(i.suggestions),s.noCache||(this.cachedResponse[i[s.paramName]]=i,0===i.suggestions.length&&this.badQueries.push(i[s.paramName])),t===this.getQuery(this.currentValue)&&(this.suggestions=i.suggestions,this.suggest())},activate:function(t){var s=this.classes.selected,i=e(this.suggestionsContainer),n=i.children();return i.children("."+s).removeClass(s),this.selectedIndex=t,-1!==this.selectedIndex&&n.length>this.selectedIndex?(t=n.get(this.selectedIndex),e(t).addClass(s),t):null},select:function(e,t){var s=this.suggestions[e];s&&(this.el.val(s),this.ignoreValueChange=t,this.hide(),this.onSelect(e))},moveUp:function(){-1!==this.selectedIndex&&(0===this.selectedIndex?(e(this.suggestionsContainer).children().first().removeClass(this.classes.selected),this.selectedIndex=-1,this.el.val(this.currentValue)):this.adjustScroll(this.selectedIndex-1))},moveDown:function(){this.selectedIndex!==this.suggestions.length-1&&this.adjustScroll(this.selectedIndex+1)},adjustScroll:function(t){var s,i,n=this.activate(t);n&&(n=n.offsetTop,i=(s=e(this.suggestionsContainer).scrollTop())+this.options.maxHeight-25,ni&&e(this.suggestionsContainer).scrollTop(n-this.options.maxHeight+25),this.el.val(this.getValue(this.suggestions[t].value)))},onSelect:function(t){var s=this.options.onSelect;t=this.suggestions[t],this.el.val(this.getValue(t.value)),e.isFunction(s)&&s.call(this.element,t)},getValue:function(e){var t,s=this.options.delimiter;return s?1===(s=(t=this.currentValue).split(s)).length?e:t.substr(0,t.length-s[s.length-1].length)+e:e},dispose:function(){this.el.off(".autocomplete").removeData("autocomplete"),this.disableKillerFn(),e(this.suggestionsContainer).remove()}},e.fn.autocomplete=function(s,i){return 0===arguments.length?this.first().data("autocomplete"):this.each((function(){var n=e(this),o=n.data("autocomplete");"string"==typeof s?o&&"function"==typeof o[s]&&o[s](i):(o&&o.dispose&&o.dispose(),o=new t(this,s),n.data("autocomplete",o))}))}}));